﻿using System.Data.EntityClient;
using System.Data.Metadata.Edm;
using System.Data.Objects;
using System.Reflection;
using BrasilFramework.Comum;
using BrasilFramework.Comum.Excecao;
using BrasilFramework.Dado.Comum;

namespace BrasilFramework.Dado.EF.Comum
{
    public static class Mapeamento
    {
        private static readonly object controleBloqueio = new object();
        private static MetadataWorkspace mwMapeamento;

        public static ObjectContext Contexto(Conexao conexao)
        {

            if (mwMapeamento != null) return new ObjectContext(new EntityConnection(mwMapeamento, conexao.ConexaoBase));

            lock (controleBloqueio)
            {
                //Verificação realizada novamente, pois um ou mais usuários podem acessar o objeto quando estiver nulo.
                if (mwMapeamento == null)
                {
                    string assemblyDado = string.Format("{0}.Dado", Configuracao.Sigla);

                    Assembly biblioteca = Assembly.Load(assemblyDado);

                    if (biblioteca == null)
                        throw new DadoException(string.Format("Não foi possível carregar biblioteca {0}.", assemblyDado));

                    mwMapeamento = new MetadataWorkspace(new[] {"res://*/"}, new[] {biblioteca});
                }

                ObjectContext contexto = new ObjectContext(new EntityConnection(mwMapeamento, conexao.ConexaoBase))
                                             {DefaultContainerName = "Mapeamento"};

                return contexto;
            }
        }
    }
}